昨天我們完成了jwt的實作,使用者在註冊和登入後都能得到一組token
使用者需要附上這一組token才能新增、刪除bootcamp或course
在Postman Tests設定:
pm.environment.set("TOKEN", pm.response.json().token);
就能將server回傳的token設定在TOKEN這個變數中
如果要在送出request時附上token, 需要在Authorization Type選擇Bearer Token
新增auth.js middleware
使用者需要在request header設定Authorization&Bearer "token value"的key value pair
這樣Postman才會將token儲存至環境變數
exports.protect = asyncHandler(async (req, res, next) => {
let token;
if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
token = req.headers.authorization.split(' ')[1];
}
// 確定token存在
if (!token) {
return next(new ErrorResponse('Not authorize to access this route', 401));
}
// 驗證token
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = await User.findById(decoded.id);
next();
});
token驗證通過後,會回傳一個object:
利用id找到db中的user document並將其assign至req.user
之後要pass給authorize middleware作使用者role的驗證
還記得在Day13建立user schema時
有設定role type的預設值為user吧
為了不讓任何人都能輕易更動db的資料
我們只允許publisher&admin這兩個role能修改db資料
在auth.js middleware中新增函式:
exports.authorize = (...roles) => {
return (req, res, next) => {
if (!roles.includes(req.user.role)) {
return next(
new ErrorResponse(
`User role ${req.user.role} is not authorized to access this route`,
403
)
);
}
next();
}
}
req.user指的是protect函示中找到的user
所以在route file插入middleware的順序如下:
router.route('...')
.put(protect, authorize('publisher', 'admin'), updateCourse)
.delete(protect, authorize('publisher', 'admin'), deleteCourse);